package main
import (
	"fmt"
	"encoding/json"
)

type Monster struct{
	Name string 
	Age int
	Birthday string
	Sal float64
	Skill string
}

func testStruct(){
	// 演示
	monster :=Monster{
		Name : "npc1",
		Age : 500,
		Birthday: "2020-11-11",
		Sal : 8000.0,
		Skill : "ack1",
	}

	// 将monster 序列化
	data,err := json.Marshal(&monster)
	if err !=nil{
		fmt.Printf("序列号错误 err=%v\n",err)
	}

	// 输出序列化的结果
	fmt.Printf("monster 序列后的==%v\n",string(data))
}

func testMap(){
	// 定义一个map
	var a map[string]interface{}
	// 使用map 需要make
	a = make(map[string]interface{})	
	a["name"] = "npc2"
	a["age"] = 30
	a["addr"] = "add1"
	// 将a 这个map 进行序列化
	data,err :=json.Marshal(a)
	if err !=nil{
		fmt.Printf("序列化错误 err=%v\n",err)
	}
	fmt.Printf("a map 序列化后=%v\n", string(data))

}

//演示对切片进行序列化, 我们这个切片 []map[string]interface{}
func testSlice() { 
	var slice []map[string]interface{} 
	var m1 map[string]interface{}
	  //使用 map 前，需要先 make
	m1 = make(map[string]interface{}) 
	m1["name"] = "jack"
	m1["age"] = "7"
	m1["address"] = "北京"
	slice = append(slice, m1)
	var m2 map[string]interface{} 
	//使用 map 前，需要先 make 
	m2 = make(map[string]interface{})
	m2["name"] = "tom"
	m2["age"] = "20"
	m2["address"] = [2]string{"墨西哥","夏威夷"}
	slice = append(slice, m2) 
	//将切片进行序列化操作 
	data, err := json.Marshal(slice)
	if err != nil {
		 fmt.Printf("序列化错误 err=%v\n", err)
	}
	//输出序列化后的结果 
	fmt.Printf("slice 序列化后=%v\n", string(data))
}

//对基本数据类型序列化，对基本数据类型进行序列化意义不大
 func testFloat64() {
	var num1 float64 = 2345.67 
	//对 num1 进行序列化
	data, err := json.Marshal(num1)
	if err != nil { 
		fmt.Printf("序列化错误 err=%v\n", err) 
	}
	//输出序列化后的结果 
	fmt.Printf("num1 序列化后=%v\n", string(data))
}
func main() {
	testStruct()	
	testMap()
	testSlice()
	testFloat64()
}

// 对于结构体的序列化，如果我们希望序列化后的 key的名字，
// 由我们自己重新制定，那么可以给struct 指定一个 tag 标签
type Npc struct{
	Name string `json:"npc_name` // 反射机制
	Age int `json:"npc_age"`
	Birthday string `json:npc_birthday`
	Sal float64 `json:npc_sal`
	Skill string `json:npc_skill`

}